/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package domain.controllers;

import domain.Entity.EntityProyecto;
import domain.Entity.EntityTarea;
import domain.Entity.EntityTareaTrabajada;
import domain.Entity.EntityTrabajador;
import domain.Entity.EntityUsuario;
import domain.commands.TareaTrabajadaComando;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import managers.UsuarioManager;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet.view.RedirectView;

/**
 *
 * @author jorge
 */
public class modificarTiempoController extends SimpleFormController{
    
    UsuarioManager um = UsuarioManager.getInstance();
    
    public modificarTiempoController() {
        setCommandClass(TareaTrabajadaComando.class);
  }

    @Override
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, org.springframework.validation.BindException errors) throws Exception {
          
        ModelAndView mav = new ModelAndView();
        HttpSession session = request.getSession(true);
        TareaTrabajadaComando ttc = (TareaTrabajadaComando) command;
        
        EntityUsuario eu = (EntityUsuario) session.getAttribute("usuario");
        long dni = eu.getDni();
        EntityTrabajador etr = um.getTrabajador(dni);
        EntityTarea et = (EntityTarea) session.getAttribute("tarea");
        
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        Date fecha = sdf.parse(ttc.getFecha());
        
        Time tiempoInicial = calculaTiempoInicial(ttc.getHoraIni());
        Time tiempoFinal = calculaTiempoFinal(ttc.getHoraFin());
        
        Date actual = new Date();
        
        if(estaTrabajando(fecha,tiempoFinal,tiempoInicial,etr) || fechaLimite(fecha,et) || fecha.compareTo(actual)> 0){
            
            mav.setView(new RedirectView("error.htm"));
            
        }else{
        
        Time tiempoTrabajado = calculaTiempoTrabajado(tiempoInicial,tiempoFinal);
        
        EntityTareaTrabajada ett = new EntityTareaTrabajada();
        
        ett.setFecha(fecha);
        ett.setHora_ini(tiempoInicial);
        ett.setHora_fin(tiempoFinal);
        ett.setTiempo(tiempoTrabajado);
        ett.setEt(et);
        ett.setEtr(etr);
        ett.setComentario(ttc.getComentario());
      
        EntityProyecto ep = et.getEpy();
        ep = calculaTiempoProyecto(ep,tiempoTrabajado);
        if(ep.getHoras_maximas()< ep.getHoras()){  
            mav.setView(new RedirectView("error.htm"));
        }
        double horasProyecto = ep.getHoras();
        double horasMaximas = ep.getHoras_maximas();
        double porcentajeProyecto = ((horasProyecto / horasMaximas) * 100);
        ep.setPorcentaje((int) porcentajeProyecto);
        
        et = calculaTiempoTarea(et,tiempoTrabajado);
        double horasTarea = et.getHoras();
        double porcentajeTarea = ((horasTarea / horasProyecto) * 100);
        et.setPorcentaje((int) porcentajeTarea);
       
        etr = calculaTiempoTrabajador(etr,tiempoTrabajado);
        
        um.trabajar(ett,etr,et,ep);
        
        Date hoy = new Date();
        List tareasTrabajadas = um.tareasTrabajadasFecha(etr, hoy);
        session.setAttribute("trabajosdehoy", tareasTrabajadas);
        
        mav.setView(new RedirectView("misTareas.htm"));
        }
        
        return mav;
        
    }

    private Time calculaTiempoFinal(String horaFin) {
        int hf= Integer.parseInt(horaFin.charAt(0) +""+ horaFin.charAt(1));
        int mf= Integer.parseInt(horaFin.charAt(3) +""+ horaFin.charAt(4));
        Time tiempoFinal = new Time(hf,mf,0);
        return tiempoFinal;
    }

    private Time calculaTiempoInicial(String horaIni) {
        int hi= Integer.parseInt(horaIni.charAt(0) +""+ horaIni.charAt(1));
        int mi= Integer.parseInt(horaIni.charAt(3) +""+ horaIni.charAt(4));
        Time tiempoInicial = new Time(hi,mi,0);
        return tiempoInicial;
    }

    private EntityProyecto calculaTiempoProyecto(EntityProyecto ep, Time tiempoTrabajado) {
        
        int horasTiempoProyecto = ep.getHoras();
        horasTiempoProyecto = horasTiempoProyecto + tiempoTrabajado.getHours();
        int minutosTiempoProyecto = ep.getMinutos();
        minutosTiempoProyecto = minutosTiempoProyecto + tiempoTrabajado.getMinutes();
        if(minutosTiempoProyecto  > 60){
           horasTiempoProyecto = horasTiempoProyecto + 1;
           minutosTiempoProyecto = minutosTiempoProyecto - 60;
        }
        ep.setHoras(horasTiempoProyecto);
        ep.setMinutos(minutosTiempoProyecto);
        return ep;
    }

    private EntityTarea calculaTiempoTarea(EntityTarea et, Time tiempoTrabajado) {
        
        
        int horasTiempoTarea = et.getHoras();
        horasTiempoTarea = horasTiempoTarea + tiempoTrabajado.getHours();
        int minutosTiempoTarea = et.getMinutos();
        minutosTiempoTarea = minutosTiempoTarea + tiempoTrabajado.getMinutes();
        if(minutosTiempoTarea  > 60){
           horasTiempoTarea = horasTiempoTarea + 1;
           minutosTiempoTarea = minutosTiempoTarea - 60;
        }
        et.setHoras(horasTiempoTarea);
        et.setMinutos(minutosTiempoTarea);
        return et;
    }

    private Time calculaTiempoTrabajado(Time tiempoInicial, Time tiempoFinal) {
        int hi = tiempoInicial.getHours();
        int hf = tiempoFinal.getHours();
        int mi = tiempoInicial.getMinutes();
        int mf = tiempoFinal.getMinutes();
        int ht = hf - hi ;
        if(mf - mi < 0){
            ht = ht -1;
        }
        int mt = mf - mi;
        if(mt < 0){
            mt = 60 + mt;
        }
        Time tiempoTrabajado = new Time(ht,mt,0); 
        return tiempoTrabajado;
    }

    private EntityTrabajador calculaTiempoTrabajador(EntityTrabajador etr, Time tiempoTrabajado) {
        
        int horasTiempoTrabajador = etr.getHoras();
        horasTiempoTrabajador = horasTiempoTrabajador + tiempoTrabajado.getHours();
        int minutosTiempoTrabajador = etr.getMinutos();
        minutosTiempoTrabajador = minutosTiempoTrabajador + tiempoTrabajado.getMinutes();
        if(minutosTiempoTrabajador  > 60){
           horasTiempoTrabajador = horasTiempoTrabajador + 1;
           minutosTiempoTrabajador = minutosTiempoTrabajador - 60;
        }
        etr.setHoras(horasTiempoTrabajador);
        etr.setMinutos(minutosTiempoTrabajador);
        return etr;
    }

    private boolean estaTrabajando(Date fecha, Time tiempoFinal, Time tiempoInicial,EntityTrabajador etr) {
        
        List tareasTrabajadas = um.tareasTrabajadasFecha(etr, fecha);
        boolean b = false;
        Iterator it = tareasTrabajadas.iterator();
        while(it.hasNext() && !b){
            EntityTareaTrabajada ett = (EntityTareaTrabajada) it.next();
            /*
                TODO: Change!!!!!
             Time horaIni = ett.getHora_ini();
            Time horaFin = ett.getHora_fin();
              if(horaIni.compareTo(tiempoInicial) < 0 || horaIni.compareTo(tiempoInicial) == 0 ){
                  if(horaFin.compareTo(tiempoInicial) > 0 || horaFin.compareTo(tiempoInicial) == 0 ){
                      b = true;
                  }
             }else{
                if(horaFin.compareTo(tiempoFinal) > 0 || horaIni.compareTo(tiempoFinal) == 0 ){
                  if(horaFin.compareTo(tiempoFinal) < 0 || horaFin.compareTo(tiempoFinal) == 0 ){
                      b = true;
                  }
                }  
             } */
            }
        
        return b;
    }

    private boolean fechaLimite(Date fecha, EntityTarea et) {
        boolean b = false;
        if(et.getFecha_ini() != null ){
            if(fecha.compareTo(et.getFecha_ini()) < 0 ){
                b = true;
            }
        }    
        if(et.getFecha_fin() != null && !b){
           if(fecha.compareTo(et.getFecha_fin()) > 0){
               b = true;
           }
        }
        
        if(fecha.compareTo(et.getEpy().getFecha_ini()) < 0 ){
            b = true;
        }
        
        if(fecha.compareTo(et.getEpy().getFecha_fin()) > 0 ){
            b = true;
        }
        
        return b;
        }

}
